package org.example.scoresystem_backen.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.example.scoresystem_backen.entity.Class;

import java.util.List;

/**
 * 班级数据访问Mapper接口
 */
@Mapper
public interface ClassMapper {
    
    /**
     * 根据ID查找班级
     * @param id 班级ID
     * @return 班级信息
     */
    Class findById(@Param("id") Integer id);
    
    /**
     * 查找所有班级
     * @return 班级列表
     */
    List<Class> findAll();
    
    /**
     * 根据班级名称查找班级
     * @param name 班级名称
     * @return 班级信息
     */
    Class findByName(@Param("name") String name);
    
    /**
     * 根据年级查找班级列表
     * @param grade 年级
     * @return 班级列表
     */
    List<Class> findByGrade(@Param("grade") String grade);
    
    /**
     * 根据班级名称和年级查找班级
     * @param name 班级名称
     * @param grade 年级
     * @return 班级信息
     */
    Class findByNameAndGrade(@Param("name") String name, @Param("grade") String grade);
    
    /**
     * 根据班级名称模糊查询
     * @param name 班级名称关键字
     * @return 班级列表
     */
    List<Class> findByNameContaining(@Param("name") String name);
    
    /**
     * 检查班级名称和年级组合是否存在
     * @param name 班级名称
     * @param grade 年级
     * @return 是否存在
     */
    boolean existsByNameAndGrade(@Param("name") String name, @Param("grade") String grade);
    
    /**
     * 插入班级
     * @param clazz 班级信息
     * @return 影响行数
     */
    int insert(Class clazz);
    
    /**
     * 更新班级信息
     * @param clazz 班级信息
     * @return 影响行数
     */
    int update(Class clazz);
    
    /**
     * 根据ID删除班级
     * @param id 班级ID
     * @return 影响行数
     */
    int deleteById(@Param("id") Integer id);
    
    /**
     * 根据班级名称查找班级列表（精确匹配）
     * @param name 班级名称
     * @return 班级列表
     */
    List<Class> findAllByName(@Param("name") String name);

    /**
     * 根据年级模糊查询班级
     * @param grade 年级关键字
     * @return 班级列表
     */
    List<Class> findByGradeContaining(@Param("grade") String grade);

    /**
     * 获取所有年级列表（去重）
     * @return 年级列表
     */
    List<String> findAllGrades();

    /**
     * 统计班级总数
     * @return 班级总数
     */
    Long count();

    /**
     * 分页查询班级（支持搜索和筛选）
     * @param search 搜索关键词（班级名称模糊查询）
     * @param grade 年级筛选
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 班级列表
     */
    List<Class> findClassesWithPagination(@Param("search") String search,
                                         @Param("grade") String grade,
                                         @Param("offset") Integer offset,
                                         @Param("limit") Integer limit);

    /**
     * 统计符合条件的班级数量
     * @param search 搜索关键词
     * @param grade 年级筛选
     * @return 班级数量
     */
    Long countClassesWithFilter(@Param("search") String search, @Param("grade") String grade);
}
